Skip to content

Add per-test fieldcompare tolerance and skip_compare#847

Open
PranjalManhgaye wants to merge 3 commits into
precice:developfrom
PranjalManhgaye:feature/837-fieldcompare-tolerance
Open

Add per-test fieldcompare tolerance and skip_compare#847
PranjalManhgaye wants to merge 3 commits into
precice:developfrom
PranjalManhgaye:feature/837-fieldcompare-tolerance

Conversation

@PranjalManhgaye

Copy link
Copy Markdown
Collaborator

summary

closes #837

i added optional tolerance and skip_compare fields in tests.yaml so we can override fieldcompare rtol per test (or skip compare entirely if we only care about build + run).

before this we had some tests stuck in expected-to-fail or commented out in component suites because exported vtk values are tiny and the default 3e-7 rtol basically always fails. now those cases use tolerance: 1e-2 instead.

what changed

  • parse tolerance and skip_compare in the system test yaml loader
  • pass rtol into the fieldcompare docker compose template (-rtol {{ tolerance }})
  • wire it through systemtests.py and generate_reference_results.py
  • remove the expected-to-fail suite
  • re-enable the affected tests in fenics-adapter, openfoam-adapter, micro-manager, and nutils-adapter
  • docs + changelog entry
    tests without tolerance still use the default 3e-7 so behavior for everything else should be the same.

local testing

i tried to run things locally on my machine , elastic-tube-3d (fluid-openfoam + solid-fenics) : full build / run / fieldcompare pass with -rtol 0.01 (32/32 comparisons) , this is the main case we cared about for this issue.

macro-nutils_micro-nutils : reference tarball doesn’t exist on develop yet so i couldn’t validate that one end-to-end
so yeah locally we’ve got solid proof for the fenics case ; the rest we’ll need ci .

notes for reviewers

would be great to trigger system tests on fenics-adapter, openfoam-adapter, micro-manager, dumux-adapter (and nutils-adapter once the nutils reference exists)
macro-nutils_micro-nutils is re-enabled in yaml but the reference file might still be missing upstream : heads up if ci complains there

happy to tweak tolerance values if 1e-2 is too loose or too tight for any of the three cases ,,

Allow overriding fieldcompare rtol via tests.yaml and optionally skip
the compare step. Re-enable previously quarantined tests with tolerance
1e-2 for near-zero exported fields.
Wrap long tolerance/skip_compare lines so check_style pre-commit passes.
@PranjalManhgaye PranjalManhgaye requested a review from MakisH June 17, 2026 09:21
@MakisH MakisH changed the title Add per-test fieldcompare tolerance and skip_compare (#837) Add per-test fieldcompare tolerance and skip_compare Jun 23, 2026

@MakisH MakisH left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for implementing!

Here are some comments to apply before testing on GHA.

Comment thread tools/tests/tests.yaml

# Excluded:
# *elastic-tube-3d_fluid-openfoam_solid-fenics # too small values to compare
- *elastic-tube-3d_fluid-openfoam_solid-fenics

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lists in this file are meant to be sorted alphabetically. Similar issue in the other previously commented-out tests in this file.

Comment thread tools/tests/README.md
-rtol 3e-7
```

The default relative tolerance is `3e-7`. Per-test overrides are available in `tests.yaml` via `tolerance` (passed to fieldcompare as `-rtol`). Set `skip_compare: true` to skip the comparison step and only verify that build and run succeed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The default relative tolerance is `3e-7`. Per-test overrides are available in `tests.yaml` via `tolerance` (passed to fieldcompare as `-rtol`). Set `skip_compare: true` to skip the comparison step and only verify that build and run succeed.
The default relative tolerance (`-rtol`) is `3e-7`. Per-test overrides are possible in `tests.yaml` (e.g., `tolerance: 1e-2`). Set `skip_compare: true` to skip the comparison step and only verify that the build and run steps succeed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does the generate_reference_results.py need information about numerical regression checks?

Comment thread changelog-entries/847.md
@@ -0,0 +1 @@
- Add optional `tolerance` and `skip_compare` fields to `tests.yaml` for per-test fieldcompare configuration closes #837.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Add optional `tolerance` and `skip_compare` fields to `tests.yaml` for per-test fieldcompare configuration closes #837.
- Add optional `tolerance` and `skip_compare` fields to `tests.yaml` for per-test fieldcompare configuration [#847](https://github.com/precice/tutorials/pull/847)



GLOBAL_TIMEOUT = int(os.environ.get("PRECICE_SYSTEMTESTS_TIMEOUT", 600))
DEFAULT_FIELDCOMPARE_RTOL = 3e-7

@MakisH MakisH Jun 23, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As more and more parameters accumulate here, I am wondering if we need a defaults dictionary, to reduce the number of arguments we pass aroung. But maybe implement that in a separate PR.

Comment on lines +676 to +684
def _log_skipped_fieldcompare(self) -> None:
log_sink = getattr(self, "_log_sink", None)
if log_sink is not None:
log_sink.begin_stage("compare")
log_sink.append_stdout(
f"(skipped: skip_compare=true, default rtol would be {DEFAULT_FIELDCOMPARE_RTOL})",
"compare",
)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is a dedicated function needed to log that the fieldcompare step was skipped?

max_time_windows: int | None = None
timeout: int = GLOBAL_TIMEOUT
tolerance: float = DEFAULT_FIELDCOMPARE_RTOL
skip_compare: bool = False

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a bit torn on whether the skip_comparison is needed. I would also rather formulate it positively: compare_results: false. One reason to remove it would be that it seems that most of the code additions come due to that. While we could completely skip the comparisons to work around failing runs, these would anyway fail at the run step.

I would suggest removing it. Setting a large tolerance already provides the capability to effectively skip comparisons.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Overriding the fieldcompare tolerance (or skipping)

2 participants